package com.facade.base.cud;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface IBaseFacadeCUD<T> {

    /**
     * 向数据库中添加实体,
     * null的属性也会保存，不会使用数据库默认值
     *
     * @param t
     * @return
     */
    T add(T t);

    /**
     * 向数据库中添加实体,
     * null的属性不会保存，会使用数据库默认值
     *
     * @param t
     * @return
     */
    T addSelective(T t);

    /**
     * 批量向数据库中添加实体,
     * null属性也会保存，不会使用数据库默认值
     *
     * @param tList
     * @return
     */
    List<T> addBatch(List<T> tList);

    /**
     * 批量向数据库中添加实体,
     * null的属性不会保存，会使用数据库默认值
     * 循环单条调用addSelective方法
     *
     * @param tList
     * @return
     */
    List<T> addSelectiveBatch(List<T> tList);

    /**
     * 根据主键更新实体全部字段，实体字段null值会被更新
     *
     * @param t
     * @return
     */
    T update(T t);

    /**
     * 通过对象属性相等删除记录
     *
     * @param t
     * @return
     */
    T delete(T t);

    /**
     * 根据主键删除实体
     *
     * @param id
     * @return
     */
    int deleteByPrimaryKey(Serializable id);

    /**
     * 根据属性值相等删除记录
     *
     * @param property
     * @param value
     * @return
     */
    int deleteByPropertyEqualTo(String property, Object value);

    /**
     * 根据多个属性值相等删除记录
     *
     * @param propertyValue
     * @return
     */
    int deleteByPropertiesEqualTo(Map<String, Object> propertyValue);

    /**
     * 根据多个属性值相等以及指定集合删除记录
     *
     * @param propertyValue
     * @return
     */
    int deleteByPropertiesEqualToAndIn(Map<String, Object> propertyValue);

    /**
     * 根据属性值不相等删除记录
     *
     * @param property
     * @param value
     * @return
     */
    int deleteByPropertyNotEqualTo(String property, Object value);

    /**
     * 根据属性值在指定集合中删除记录
     *
     * @param property
     * @param params
     * @return
     */
    int deleteByPropertyIn(String property, List<?> params);

    /**
     * 根据属性值不在指定集合中删除记录
     *
     * @param property
     * @param params
     * @return
     */
    int deleteByPropertyNotIn(String property, List<?> params);

    /**
     * 清除表中所有记录, 此方法一般用于多对多关系的中间表调用
     *
     * @return
     */
    int deleteAll();
}